# 单例模式: 确保一个类只有一个实例,并提供一个全局访问点
# 单例模式: 一个特殊的类, 只存在一个实例
# 单例模式: 节省内存空间
# 单例模式: 线程安全问题
# 实现方式 1: 通过@classmethod装饰器实现
# 实现方式 2: 通过装饰器实现
# 实现方式 3: 通过重写 __new__方法实现
# 实现方式 4: 通过模块实现

# class Animal(object):
#     pass
    # _instance = None  # 类变量, 用于存储唯一实例
    #
    # def __new__(cls, *args, **kwargs):
    #     if not cls._instance:  # 如果实例不存在
    #         cls._instance = super().__new__(cls)  # 创建新实例
    #     return cls._instance  # 返回唯一实例
    #
    # def __init__(self, name):
    #     if not hasattr(self, 'initialized'):  # 确保只初始化一次
    #         self.name = name
    #         self.initialized = True  # 标记已初始化

# 对象的内存地址都是一样的
# a1 = Animal()
# a2 = Animal()

# 设计流程
# 1. 定义一个类变量来存储唯一实例 初始值为None
# 2. 重写__new__方法
# 3. 进行判断,在__new__方法中检查类变量是否为None,把__new__()返回的对象引用保存进去
# 4. 返回类属性中记录的对象引用

class Singleton(object):
    instance = None  # 类变量, 用于存储唯一实例
    def __new__(cls):
        if cls.instance is None: # 如果实例不存在, 则创建新实例, 否则返回已有实例
            cls.instance =  super().__new__(cls)
        return cls.instance
    def __int__(self):
        print("This is Singleton.__int__()")

s1 = Singleton()
s2 = Singleton()
print(s1 is s2)  # True, s1和s2是同一个实例
